#ifndef _sdl_prim_h_
#define _sdl_prim_h_

#include "SDL.h"
#include "sdl_exceptions.h"
#include <string>
#include <cstdlib>
#include <iostream>
#include <stdexcept>


#ifndef sdl_prim_name
#define sdl_prim_name std::string("generic primitive")
#endif


template<class data_t> class sdl_ptr;

/**
 * Obiekt bazowy dla wszystkich innych obiektow
 */

class sdl_prim {
	template<class sdl_prim>	friend class sdl_ptr;
	template<class sdl_prim>	friend class sdl_singleton;
	template<class sdl_prim>	friend sdl_prim * persistent(sdl_prim * p);
	///aplikacja może mieć możliwość zmiany debug levelu
	friend 	class 	sdl_app;
	long __ref;
protected:
	///globalny debug level, debugowanie w tej warstwie jest niezależne od klasy debug, bo ta klasa się opiera na sdl_ptr
	static int __debug_level;
	std::string __name;
	long  __add_ref() ;
	long  __dec_ref() ;

public:
	///można śledzić referencje każdego obiektu
	int __internal_debug_level;
	sdl_prim(const std::string & n=sdl_prim_name);
	virtual  ~sdl_prim();
	const  std::string & name() const ;
	///definiuję tak, żeby zapobiec przypisaniom do sdl_ptr
	virtual  sdl_prim * operator&() ;
};

template<class data_t>
data_t * persistent(data_t * d){
	d->__add_ref();
	return d;
}


#endif //_sdl_prim_h_

